package com.xbongbong.pro.statistic.result.pojo;

import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;

import java.io.Serializable;
import java.util.List;

/**
 * 图表某个字段的钻取信息pojo，比如分类、系列、行列分组的钻取信息
 * @author zcp
 * @version v1.0
 * @since v1.0
 */
@Getter
@Setter
@ToString
@NoArgsConstructor
public class DrillResultChartFieldInfoPojo implements Serializable {
    private static final long serialVersionUID = 7952422509192431608L;
    /**
     * 钻取图表的哪个字段（分类、系列、行列分组字段）
     * @link DrillFieldEnum
     */
    private String chartField;
    /**
     * 点击的当前钻取字段
     * 比如钻取层级为A -> B -> C -> D，点击C进行下钻或上卷，则 currentDrillField 即为字段C
     */
    private FieldAttrPojo currentDrillField;
    /**
     * 当前钻取字段所属层级内所有的字段attrList
     * 每个层级字段只能匹配到一个chart分组内的某个字段（要么匹配到行分组内字段、要么列分组字段；要么分类、要么系列）
     */
    private List<String> currentDrillAttrList;

    /**
     * 上卷or下钻
     * @link DrillDirEnum
     */
    private String drillDir;
    /**
     * 钻取目标字段：即钻取后的指向字段
     * 比如钻取层级为A -> B -> C -> D，点击C进行下钻，则goalDrillField为D；点击C上卷，则goalDrillField为B
     */
    private FieldAttrPojo goalDrillField;
    /**
     * 下钻（包含下钻多层后的上卷）多级后，需要把指向字段前所有的条件都强制画到表格左侧内。即把处理后的 drillCondition 强制画到表格内
     * 并且拼减号：新的分组字段（goalDrillField）根据匹配规则画“+”号（没下级则无+号），然后新分组字段之前的条件画“-”号
     * 注：需要剔除非该分组的条件信息 -- 如果是钻取字段则需要在表内强制塞入一项，但非钻取纯条件的（点右侧/下侧行列分组钻取，然后左侧/上侧其他行列分组的字段作为纯条件）则不能塞。因此需要结合 currentDrillAttrList 把当前钻取字段所属层级
     */
    private List<FieldAttrPojo> conditionToTableList;

    /**
     * 初始化，未确定钻取后指向字段
     * @param chartField
     * @param currentDrillField
     * @param drillDir
     * @param conditionToTableList
     * @author zcp
     * @since v1.0
     * @version v1.0
     */
    public DrillResultChartFieldInfoPojo(String chartField, FieldAttrPojo currentDrillField, String drillDir, List<FieldAttrPojo> conditionToTableList) {
        this.chartField = chartField;
        this.currentDrillField = currentDrillField;
        this.drillDir = drillDir;
        this.conditionToTableList = conditionToTableList;
    }
    /**
     * 初始化，确定钻取后指向字段（特殊字段是本身，可以直接确定）
     * @param chartField
     * @param currentDrillField
     * @param drillDir
     * @param goalDrillField
     * @param conditionToTableList
     * @author zcp
     * @since v1.0
     * @version v1.0
     */
    public DrillResultChartFieldInfoPojo(String chartField, FieldAttrPojo currentDrillField, String drillDir, FieldAttrPojo goalDrillField, List<FieldAttrPojo> conditionToTableList) {
        this.chartField = chartField;
        this.currentDrillField = currentDrillField;
        this.drillDir = drillDir;
        this.goalDrillField = goalDrillField;
        this.conditionToTableList = conditionToTableList;
    }
}
